
#include "fp_protocol.h"

std::vector<uint8_t> Fp_protocol::fp_vector;
// 补充无参构造函数
Fp_protocol::Fp_protocol()
{
    // 默认初始化成员变量，Protocol_Data为对象自动初始化
}

void Fp_protocol::FProtocol_init()
{
    // 添加包头
    addPacketHead();
    // 添加设备地址
    addDeviceAddr();
    // 添加包标识
    addPacketId();
    //  添加包长度
    addPacketLength();
    //  添加载荷
    addPayload();
    // 添加校验和
    addCheckSum();
}

void Fp_protocol::Dis_protocol()
{
    for (auto item : (*Fp_protocol::Get_vector()))
    {
        cout << hex << setfill('0') << setw(2) << static_cast<int>(item) << "  ";
    }
    cout << endl;
}

Fp_protocol Fp_protocol::HS_Protocol()
{
    //清空之前的协议数据
    fp_vector.clear();
    Fp_protocol dataFormat;
    dataFormat.pro_data.payload.clear();
    vector<uint8_t> payload = {0x35};
    dataFormat.pro_data.Fp_DataFormat(&dataFormat.pro_data, REQUEST_PACKET_ID, payload);
    dataFormat.FProtocol_init();
    return dataFormat;
}

Fp_protocol Fp_protocol::Auto_Identify(uint16_t id, uint16_t params)
{
    //清空之前的协议数据
    fp_vector.clear();
    Fp_protocol dataFormat;
    dataFormat.pro_data.payload.clear();
    vector<uint8_t> payload = {0x32, 0x1, (uint8_t)((id >> 8) & 0xff), (uint8_t)(id & 0xff), (uint8_t)((params >> 8) & 0xff), (uint8_t)(params & 0xff)};
    dataFormat.pro_data.Fp_DataFormat(&dataFormat.pro_data, REQUEST_PACKET_ID, payload);
    dataFormat.FProtocol_init();
    return dataFormat;
}

Fp_protocol Fp_protocol::Delete_Protocol(const uint16_t pageId, const uint16_t delCount)
{
    fp_vector.clear();
    Fp_protocol dataFormat;
    dataFormat.pro_data.payload.clear();
    vector<uint8_t> payload = {0x0C, (uint8_t)((pageId >> 8) & 0xff), (uint8_t)(pageId & 0xff), (uint8_t)((delCount >> 8) & 0xff), (uint8_t)(delCount & 0xff)};
    dataFormat.pro_data.Fp_DataFormat(&dataFormat.pro_data, REQUEST_PACKET_ID, payload);
    dataFormat.FProtocol_init();
    return dataFormat;
}

Fp_protocol Fp_protocol::Erase_FProtocol()
{
    fp_vector.clear();
    Fp_protocol dataFormat;
    dataFormat.pro_data.payload.clear();
    vector<uint8_t> payload = {0x0D};
    dataFormat.pro_data.Fp_DataFormat(&dataFormat.pro_data, REQUEST_PACKET_ID, payload);
    dataFormat.FProtocol_init();
    return dataFormat;
}

Fp_protocol Fp_protocol::Valid_NumsProtocol()
{
    fp_vector.clear();
    Fp_protocol dataFormat;
    dataFormat.pro_data.payload.clear();
    vector<uint8_t> payload = {0x1D};
    dataFormat.pro_data.Fp_DataFormat(&dataFormat.pro_data, REQUEST_PACKET_ID, payload);
    dataFormat.FProtocol_init();
    return dataFormat;
}

Fp_protocol Fp_protocol::GetImage_Protocol()
{
    fp_vector.clear();
    Fp_protocol dataFormat;
    dataFormat.pro_data.payload.clear();
    vector<uint8_t> payload = {0x01};
    dataFormat.pro_data.Fp_DataFormat(&dataFormat.pro_data, REQUEST_PACKET_ID, payload);
    dataFormat.FProtocol_init();
    return dataFormat;
}

Fp_protocol Fp_protocol::Store_Protocol(uint16_t pageId, uint8_t bufId)
{
    fp_vector.clear();
    Fp_protocol dataFormat;
    dataFormat.pro_data.payload.clear();
    vector<uint8_t> payload = {0x06, bufId, (uint8_t)((pageId >> 8) & 0xff), (uint8_t)(pageId & 0xff)};
    dataFormat.pro_data.Fp_DataFormat(&dataFormat.pro_data, REQUEST_PACKET_ID, payload);
    dataFormat.FProtocol_init();
    return dataFormat;
}

Fp_protocol Fp_protocol::Search_Protocol(uint8_t bufId, uint16_t start, uint16_t pages)
{
    fp_vector.clear();
    Fp_protocol dataFormat;
    dataFormat.pro_data.payload.clear();
    vector<uint8_t> payload = {0x04, bufId, (uint8_t)((start >> 8) & 0xff), (uint8_t)(start & 0xff), (uint8_t)((pages >> 8) & 0xff), (uint8_t)(pages & 0xff)};
    dataFormat.pro_data.Fp_DataFormat(&dataFormat.pro_data, REQUEST_PACKET_ID, payload);
    dataFormat.FProtocol_init();
    return dataFormat;
}

Fp_protocol Fp_protocol::Acknow_Protocol(vector<uint8_t> packetData)
{
    Fp_protocol dataFormat;
    packet_id_t fingerprint_packet_id;
    switch (packetData[6])
    {
    case 0x01:
        fingerprint_packet_id = REQUEST_PACKET_ID;
        break;
    case 0x07:
        fingerprint_packet_id = RESPONSE_PACKET_ID;
        break;
    case 0x02:
        fingerprint_packet_id = DATA1_PACKET_ID;
        break;
    case 0x08:
        fingerprint_packet_id = DATA2_PACKET_ID;
        break;
    }
    dataFormat.pro_data.packetid = fingerprint_packet_id;
    dataFormat.pro_data.packetLength = (packetData[7] << 8) | (packetData[8]);
    size_t size = packetData.size();
    for (int i = 9; i < size - 2; i++)
    {
        dataFormat.pro_data.payload.push_back(packetData[i]);
    }
    dataFormat.pro_data.checkSum = (packetData[size - 2] << 8) | packetData[size - 1];
    return dataFormat;
}

bool Fp_protocol::isValidPacketData()
{
    uint16_t calcCheckSum = 0;
    calcCheckSum += pro_data.packetid;
    calcCheckSum += ((pro_data.packetLength >> 8) & 0xff);
    calcCheckSum += (pro_data.packetLength & 0xff);
    for (int i = 0; i < pro_data.payload.size(); i++)
    {
        calcCheckSum += pro_data.payload[i];
    }
    return calcCheckSum == pro_data.checkSum;
}

bool Fp_protocol::verifyOperationResult()
{
    uint8_t confirmationCode = this->pro_data.payload[0];
    return confirmationCode == 0x00;
}

void Fp_protocol::addPacketHead()
{
    uint16_t packetHead = pro_data.packetHead;
    fp_vector.push_back((packetHead >> 8) & 0xff);
    fp_vector.push_back(packetHead & 0xff);
}

Fp_protocol Fp_protocol::Acquire_ImageProtocol()
{
    fp_vector.clear();
    Fp_protocol dataFormat;
    dataFormat.pro_data.payload.clear();
    vector<uint8_t> payload = {0x29};
    dataFormat.pro_data.Fp_DataFormat(&dataFormat.pro_data, REQUEST_PACKET_ID, payload);
    dataFormat.FProtocol_init();
    return dataFormat;
}

Fp_protocol Fp_protocol::Feature_Protocol(uint8_t bufId)
{

    fp_vector.clear();
    Fp_protocol dataFormat;
    dataFormat.pro_data.payload.clear();
    vector<uint8_t> payload = {0x02, bufId};
    dataFormat.pro_data.Fp_DataFormat(&dataFormat.pro_data, REQUEST_PACKET_ID, payload);
    dataFormat.FProtocol_init();
    return dataFormat;
}

Fp_protocol Fp_protocol::Template_Protocol()
{
    fp_vector.clear();
    Fp_protocol dataFormat;
    dataFormat.pro_data.payload.clear();
    vector<uint8_t> payload = {0x05};
    dataFormat.pro_data.Fp_DataFormat(&dataFormat.pro_data, REQUEST_PACKET_ID, payload);
    dataFormat.FProtocol_init();
    return dataFormat;
}

void Fp_protocol::addDeviceAddr()
{
    uint32_t deviceAddr = pro_data.deviceAddr;
    for (int i = 1; i <= 4; i++)
    {
        fp_vector.push_back((deviceAddr >> (4 - i) * 8) & 0xff);
    }
}

void Fp_protocol::addPacketLength()
{
    uint16_t packetLength = pro_data.packetLength;
    fp_vector.push_back((packetLength >> 8) & 0xff);
    fp_vector.push_back(packetLength & 0xff);
}

void Fp_protocol::addPacketId()
{
    fp_vector.push_back(pro_data.packetid);
}

void Fp_protocol::addPayload()
{
    vector<uint8_t> payload = pro_data.payload;
    for (auto item : payload)
    {
        fp_vector.push_back(item);
    }
}

void Fp_protocol::addCheckSum()
{
    uint16_t checkSum = pro_data.checkSum;
    fp_vector.push_back((checkSum >> 8) & 0xff);
    fp_vector.push_back(checkSum & 0xff);
}
